#ifndef COMMON_H
#define COMMON_H

#include <QObject>

#define SAFE_DELETE(p) {if(p){delete(p);(p)=NULL;}}
#define QtToStdStringMSVC(str) (std::string((const char*)str.toUtf8()))

// 方法1: 基础逻辑判断
template <typename T>
bool isOutOfRange(const T& value, T min, T max)
{
    return (value < min) || (value > max);
}

//表头标签和列宽相关信息
struct HeaderRecord{
    HeaderRecord(const char* columnName, int columnWidth, int columnShow = 1)
    {
        csColumnName = columnName;
        iColumnWidth = columnWidth;
        iShow = columnShow;
    }
    QString csColumnName;
    int iColumnWidth;
    int iShow;
};

//BMS208解析数据表头描述
static HeaderRecord BMS_208_INFO[] =
{
    HeaderRecord("名称",100),
    HeaderRecord("当前值",200),
    HeaderRecord("描述|状态",200)
};

//BMS_Normal信息结构体
struct BMS_Normal {
    QString name;           //名称
    int value;              //值
    QString description;    //描述
};
Q_DECLARE_METATYPE(BMS_Normal)   //注册到元对象系统，就不用单独注册自定义信息了

struct AlarmData {
    QString message;     // 告警内容
    QString reason;      // 故障原因
    QString solution;    // 维修建议
    QString iconPath;    // 图标路径
    int level = 0;       // 告警级别 0-普通 1-警告 2-严重
    QString timestamp;   // 时间戳
};
Q_DECLARE_METATYPE(AlarmData)

struct CanDatas {
    double battVolt;                //电池组总电压
    double linkVolt;                //电池包端口电压
    double battCurr;                //电池组总电流
    double soc;                     //电池电量状态
    double maxCellVolt;             //最高单体电压
    double minCellVolt;             //最低单体电压
    double sOH;                     //电池健康状态
    double maxCvNO;                 //最高单体电压位置
    double minCvNO;                 //最低单体电压位置
    double maxCellTemp;             //最高电芯温度
    double maxCtNO;                 //最高温度位置
    double minCellTemp;             //最低电芯温度
    double minCtNO;                 //最低温度位置
    double avrgCellTemp;            //平均电芯温度
    double chgPwr;                  //外接充电功率
    double disChgPwr;               //外接放电功率
    double chgAmount;               //已充电电量
    double disChgAmount;            //已放电电量
    double chgFinishRemainTime;     //充电完成剩余时间
    double hV_bus_voltg;            //高压母线电压（HCU取自MCU）
    int hV_bat_power_enable;        //电池工作使能
    int vehicle_charge_state;       //系统可充电状态
    double peakDisPwr;              //解析峰值放电功率
    double ctnDisPwr;               //解析持续放电功率
    double peakChgPwr;              //解析峰值充电功率
    double ctnChgPwr;               //解析持续充电功率
    double chgReqCurr;              //充电需求电流
    double chgReqVolt;              //充电需求电压
    double chgCablCrr;              //充电线缆额定充电电流
    double maxallwCrr;              //供电设备最大允许充电电流
    int cC2Sta;                     //CC2状态
    int tempNum;                    //温度总数
    int tempNo;                     //温度编号
    double tempVal;                 //温度值
    int cellNum;                    //电芯串数
    int cvNO;                       //电芯电压编号
    double cellVolt;                //单体电芯电压
    int bMS_HW_Version_Sign;        //BMS硬件版本标识（H）
    int bMS_HW_Version;             //BMS硬件版本号（001～999）
    int bMS_SW_Version_Sign;        //BMS软件版本号标识（S）
    int bMS_SW_Version;             //BMS软件版本号（001～999）
    double plug_times;              //充电插枪次数
    double chg_Power_Cal;           //总充电量统计

    BMS_Normal data;    //结构体信息
};

#endif // COMMON_H
